# -*- coding: utf-8 -*-
# @Time    : 2024/6/5 17:47
# @Author  : yujiahao
# @File    : 04_str_format.py
# @description:字符串格式化输出

"""
Python、Java 和 Scala 格式化输出对比:

Python 格式化输出示例:

    1. 使用 % 操作符
        示例:
        name = "Alice"
        age = 30
        print("Name: %s, Age: %d" % (name, age))
        注意事项:
        - 这种方法较为古老，且在处理复杂的格式化时不太方便。
        使用场景:
        - 简单的字符串格式化。

    2. 使用 str.format() 方法
        示例:
        name = "Alice"
        age = 30
        print("Name: {}, Age: {}".format(name, age))
        注意事项:
        - 提供了更多的格式化选项，支持位置参数和关键字参数。
        使用场景:
        - 需要更复杂的字符串格式化。

    3. 使用 f-string（Python 3.6+）
        示例:
        name = "Alice"
        age = 30
        print(f"Name: {name}, Age: {age}")
        注意事项:
        - 语法简洁，执行效率高，推荐使用。
        使用场景:
        - 需要高效且易读的字符串格式化。

    4. 使用模板字符串（string.Template）
        示例:
        from string import Template
        name = "Alice"
        age = 30
        s = Template("Name: $name, Age: $age")
        print(s.substitute(name=name, age=age))
        注意事项:
        - 适用于需要安全替换的场景，避免格式化字符串注入。
        使用场景:
        - 用户输入需要插入到字符串中的场景。


Java 格式化输出示例:

    1. 使用 System.out.printf()
        示例:
        String name = "Alice";
        int age = 30;
        System.out.printf("Name: %s, Age: %d\n", name, age);
        注意事项:
        - 直接输出到控制台，不生成新的字符串。
        使用场景:
        - 需要在控制台输出格式化字符串时。

    2. 使用 String.format()
        示例:
        String name = "Alice";
        int age = 30;
        String formattedString = String.format("Name: %s, Age: %d", name, age);
        System.out.println(formattedString);
        注意事项:
        - 生成新的字符串，适合需要进一步处理或返回的场景。
        使用场景:
        - 需要生成格式化字符串进行进一步处理时。

    3. 使用 MessageFormat
        示例:
        import java.text.MessageFormat;
        String name = "Alice";
        int age = 30;
        String formattedString = MessageFormat.format("Name: {0}, Age: {1}", name, age);
        System.out.println(formattedString);
        注意事项:
        - 主要用于国际化，支持本地化消息格式。
        使用场景:
        - 需要国际化支持的场景。

    4. 使用 Formatter 类
        示例:
        import java.util.Formatter;
        String name = "Alice";
        int age = 30;
        Formatter formatter = new Formatter();
        formatter.format("Name: %s, Age: %d", name, age);
        System.out.println(formatter);
        注意事项:
        - 提供了更多的格式化选项，适用于复杂的格式化需求。
        使用场景:
        - 需要复杂和高灵活性的字符串格式化。


Scala 格式化输出示例:

    1. 使用 printf()
        示例:
        val name = "Alice"
        val age = 30
        printf("Name: %s, Age: %d\n", name, age)
        注意事项:
        - 直接输出到控制台，不生成新的字符串。
        使用场景:
        - 需要在控制台输出格式化字符串时。

    2. 使用 String.format()
        示例:
        val name = "Alice"
        val age = 30
        val formattedString = String.format("Name: %s, Age: %d", name, age)
        println(formattedString)
        注意事项:
        - 生成新的字符串，适合需要进一步处理或返回的场景。
        使用场景:
        - 需要生成格式化字符串进行进一步处理时。

    3. 使用插值字符串
        示例:
        val name = "Alice"
        val age = 30
        println(s"Name: $name, Age: $age")
        注意事项:
        - 语法简洁，执行效率高，推荐使用。
        使用场景:
        - 需要高效且易读的字符串格式化。

    4. 使用 java.text.MessageFormat
        示例:
        import java.text.MessageFormat
        val name = "Alice"
        val age = 30
        val formattedString = MessageFormat.format("Name: {0}, Age: {1}", name, age)
        println(formattedString)
        注意事项:
        - 主要用于国际化，支持本地化消息格式。
        使用场景:
        - 需要国际化支持的场景。

    5. 使用 java.util.Formatter
        示例:
        import java.util.Formatter
        val name = "Alice"
        val age = 30
        val formatter = new Formatter()
        formatter.format("Name: %s, Age: %d", name, age)
        println(formatter)
        注意事项:
        - 提供了更多的格式化选项，适用于复杂的格式化需求。
        使用场景:
        - 需要复杂和高灵活性的字符串格式化。
"""


'''
需求要实现下面的格式输出：
------------ info of Alex Li ----------
             Name  : Alex Li
             Age   : 22
             job   : Teacher 
             Hobbie: girl
    ------------- end ----------------
'''



name = input('请输入姓名:')
age = input('请输入年龄:')
job = input('请输入职业:')
hobby = input('请输入爱好:')


# todo 0、 笨办法直接用字符串拼接
a = '------------ info of Alex Li ----------'
b = 'Name:'
c = 'Age:'
d = 'Job:'
e = 'Hobby:'
f = '------------- end ----------------'
print("直接用字符串拼接拼接：\n" + a+'\n'+b+name+'\n'+c+age+'\n'+d+job+'\n'+e+hobby+'\n'+f)

# todo 1、使用str.format()


output = '''
------------ info of {name} ----------
         Name  : {name}
         Age   : {age}
         job   : {job}
         Hobbie: {hobby}
------------- end ----------------
'''.format(name=name, age=age, job=job, hobby=hobby)

# 打印输出
print("使用str.format()拼接：\n" + output)



# todo 2、%s — 字符串类型
# % 是一个占位, 回想下我们小时候给朋友占位子的场景,是的这个就是占位.那s又是什么呢? s代码的字符串类型;
msg = '''
------------ info of Alex Li ----------
        Name  : %s
        Age   : %s 
        job   : %s 
        Hobbie: %s 
------------- end ----------------
'''
print("使用占位符拼接：" + msg%(name,age,job,hobby))

# todo 3、使用 f-string（Python 3.6+）


output = f'''
------------ info of {name} ----------
         Name  : {name}
         Age   : {age}
         job   : {job}
         Hobbie: {hobby}
------------- end ----------------
'''
print("使用 f-string拼接：" + output)



print("-------------------str---------------------------☆☆☆分割线☆☆☆-----------------------num------------------")


# todo 4、%d|%i — 数字类型
# %d和%i这种格式化只能用数字来填补占位
name = input('请输入数字：')
s1 = None
s2 = None
try:
    s1 = '1234%d' % int(name)
    s2 = '1234%i' % int(name)
except Exception as e:
    print(f"你输入的不是数字，你看报错了吧：{e}")
finally:
    print(s1)
    print(s2)

# todo 5、%% — 转义
# 如果我们字符串中想要显示单独的%就需要用来个%%来转义,不然程序会认为那是一个占位
num = input('请输入进度数字：')
s = '目前学习进度:%s%%' % num
print(s)
